package com.yupi.springbootinit.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

/**
 * 操作日志内容解析工具类
 */
@Slf4j
public class OperationLogContentUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 解析操作日志内容JSON
     * 
     * @param contentJson JSON格式的内容
     * @return JsonNode对象，解析失败返回null
     */
    public static JsonNode parseContent(String contentJson) {
        try {
            if (contentJson == null || contentJson.trim().isEmpty()) {
                return null;
            }
            return objectMapper.readTree(contentJson);
        } catch (Exception e) {
            log.warn("解析操作日志内容失败: {}", contentJson, e);
            return null;
        }
    }

    /**
     * 获取操作描述
     * 
     * @param contentJson JSON格式的内容
     * @return 操作描述
     */
    public static String getDescription(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("description")) {
            return node.get("description").asText();
        }
        return "";
    }

    /**
     * 获取执行状态
     * 
     * @param contentJson JSON格式的内容
     * @return 执行状态
     */
    public static String getStatus(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("status")) {
            return node.get("status").asText();
        }
        return "未知";
    }

    /**
     * 获取执行时间
     * 
     * @param contentJson JSON格式的内容
     * @return 执行时间（毫秒）
     */
    public static Long getExecutionTime(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("executionTime")) {
            return node.get("executionTime").asLong();
        }
        return null;
    }

    /**
     * 获取错误信息
     * 
     * @param contentJson JSON格式的内容
     * @return 错误信息
     */
    public static String getErrorMessage(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("errorMessage")) {
            return node.get("errorMessage").asText();
        }
        return "";
    }

    /**
     * 获取请求参数
     * 
     * @param contentJson JSON格式的内容
     * @return 请求参数
     */
    public static String getRequestParams(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("requestParams")) {
            return node.get("requestParams").asText();
        }
        return "";
    }

    /**
     * 获取返回结果
     * 
     * @param contentJson JSON格式的内容
     * @return 返回结果
     */
    public static String getResponseResult(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node != null && node.has("responseResult")) {
            return node.get("responseResult").asText();
        }
        return "";
    }

    /**
     * 格式化显示操作日志内容
     * 
     * @param contentJson JSON格式的内容
     * @return 格式化后的字符串
     */
    public static String formatContent(String contentJson) {
        JsonNode node = parseContent(contentJson);
        if (node == null) {
            return contentJson; // 如果解析失败，返回原始内容
        }

        StringBuilder sb = new StringBuilder();
        
        // 操作描述
        if (node.has("description")) {
            sb.append("操作描述: ").append(node.get("description").asText()).append("\n");
        }
        
        // 执行状态
        if (node.has("status")) {
            sb.append("执行状态: ").append(node.get("status").asText()).append("\n");
        }
        
        // 执行时间
        if (node.has("executionTime")) {
            sb.append("执行时间: ").append(node.get("executionTime").asLong()).append("ms\n");
        }
        
        // 错误信息
        if (node.has("errorMessage")) {
            sb.append("错误信息: ").append(node.get("errorMessage").asText()).append("\n");
        }
        
        // 请求参数
        if (node.has("requestParams")) {
            sb.append("请求参数: ").append(node.get("requestParams").asText()).append("\n");
        }
        
        // 返回结果
        if (node.has("responseResult")) {
            sb.append("返回结果: ").append(node.get("responseResult").asText()).append("\n");
        }
        
        return sb.toString().trim();
    }
}